15.12 Die Klasse »Application«
 
In den vergangenen Abschnitten haben Sie einige Mitglieder der Klasse Application kennen gelernt und auch eingesetzt. Das Wichtigste war sicherlich die Methode Run, um die Nachrichtenschleife ins Leben zu rufen. Der Typ Application, der dem Namespace System.Windows.Forms angehört, stellt noch eine Reihe weiterer statischer Methoden und Eigenschaften zur Verfügung, um allgemeine Informationen der aktuellen Anwendung abzurufen.
15.12.1 Die Datei »AssemblyInfo.cs«
 
Einige allgemeine Informationen können in die Datei AssemblyInfo.cs als Attribute eingetragen werden, beispielsweise die Produktversion oder der Produktname. Nachfolgend sehen Sie einen Auszug aus dieser Datei.
| ...
|
| [assembly: AssemblyTitle("Meine Anwendung")]
|
| [assembly: AssemblyDescription("")]
|
| [assembly: AssemblyConfiguration("")]
|
| [assembly: AssemblyCompany("Tollsoft")]
|
| [assembly: AssemblyProduct("Tollsoft's Massenprodukt")]
|
| [assembly: AssemblyCopyright("Copyright @ Tollsoft 2005")]
|
| [assembly: AssemblyTrademark("")]
|
| [assembly: AssemblyCulture("")]
|
| ...
|
Zur Laufzeit lassen sich die Einträge in der Datei AssemblyInfo.cs auswerten. Mit
| MessageBox.Show(Application.ProductName);
|
können Sie zum Beispiel den Eintrag unter AssemblyProduct abrufen und in einem Meldungsfenster ausgeben.
15.12.2 Mit »Application.DoEvents« wartende Ereignisse abrufen
 
Ist einem Ereignis ein Ereignishandler zugeordnet, wird dieser ausgeführt. Ein Ereignishandler ist aber nichts anderes als eine Methode, die vom Anfang bis zum Ende ausgeführt wird, bevor die Kontrolle wieder an die aufrufende Methode übergeben wird. Wir haben es mit einer Methodenverkettung zu tun.
Wird beispielsweise ein Mausereignis ausgelöst, während die Windows-Anwendung damit beschäftigt ist, ein anderes, in der Ausführungszeit länger andauerndes Ereignis abzuarbeiten, wird das Mausereignis in einer Warteschlange gepuffert. Erst wenn der laufende Ereignishandler vollständig abgearbeitet ist, wird der nächste aus dem Puffer geholt. Die Folge ist ein nicht unbedeutendes Problem: Ein Ereignishandler, dessen Ausführung eine längere Zeit in Anspruch nimmt, wird die Bearbeitung der anderen eingehenden Ereignisse blockieren. Wie kann dieses Problem gelöst werden?
Eine mögliche Lösung wäre ein weiterer Thread. Die Programmierung kann aber im Einzelfall ziemlich komplex werden und sollte daher nicht als Nonplusultra angesehen werden. Einfacher wäre es doch, die Ausführung der laufenden Ereignisprozedur zu unterbrechen und das nächste anstehende Ereignis aus dem Puffer zu holen und zu bearbeiten. Genau das leistet die statische Methode DoEvents der Klasse Application.
Wir wollen uns die Wirkungsweise dieser Methode an einem Beispielprogramm ansehen. Das Formular enthält eine Textbox und drei Schaltflächen. Nach dem Anklicken der Schaltfläche Start wird im Ereignishandler des Ereignisses Click eine Schleife von 0 bis 1000000 durchlaufen und der aktuelle Zählerstand in die Textbox eingetragen. Die Abarbeitung der Schleife nimmt eine deutlich spürbare Zeitspanne in Anspruch, innerhalb der – wenn wir nicht mit DoEvents die Nachrichtenschleife unterbrechen – keine der beiden anderen Schaltflächen auf das Anklicken eine Reaktion zeigt. Die Schaltfläche Meldung soll nur ein einfaches Meldungsfenster anzeigen, die Schaltfläche Beenden die Laufzeit der Anwendung, unabhängig vom aktuellen Stand des Schleifenzählers, schließen.
 Hier klicken, um das Bild zu vergrößern
Abbildung 15.21 Form des Programms »DoEventsDemo«
Der Programmcode dieses Beispiels ist wie folgt:
| // --------------------------------------------------------------
|
| // Beispiel: ...\Kapitel 15\DoEventsDemo
|
| // --------------------------------------------------------------
|
| public partial class Form1 : Form {
|
| private bool flag;
|
| // Ereignishandler des Click-Ereignisses des Buttons 'btnStart'
|
| private void btnStart_Click(object sender, EventArgs e) {
|
| btnMeldung.Focus();
|
| for (int i = 0; i < 1000000; i++) {
|
| // die Nachrichtenschleife unterbrechen und zur Abarbeitung
|
| // anstehende Ereignisse aus dem Puffer holen
|
| Application.DoEvents();
|
| if (flag)
|
| break;
|
| txtZahl.Text = i.ToString();
|
| txtZahl.Refresh();
|
| }
|
| }
|
| // Ereignishandler des Click-Ereignisses des Buttons 'btnBeenden'
|
| private void btnBeenden_Click(object sender, EventArgs e) {
|
| this.flag = true;
|
| Application.Exit();
|
| }
|
| // Ereignishandler des Click-Ereignisses des Buttons 'btnMeldung'
|
| private void btnMeldung_Click(object sender, EventArgs e) {
|
| MessageBox.Show("Textausgabe unterbrochen", Application.ProductName);
|
| }
|
| }
|
Der DoEvents-Aufruf sorgt dafür, dass die Ereignishandler der beiden anderen Schaltflächen eine Chance haben, die CPU in Anspruch zu nehmen. Kommentieren Sie den DoEvents-Aufruf aus, muss die Schleife zuerst bis zum Endwert durchlaufen werden. Mit dem Feld flag wird sichergestellt, dass für den Fall, dass die Anwendung beendet werden soll, die Schleife nicht dennoch zuerst bis zum Ende ausgeführt wird, bevor die Anwendung geschlossen wird.
Der Fokus sollte vor dem Eintritt in die Schleife auf einen anderen Button gelegt werden. Wenn Sie das versäumen, müssen vor dem Anzeigen der Meldung bzw. dem Schließen noch andere Ereignisse abgearbeitet werden, was zur Folge hat, dass die entsprechende Schaltfläche zweimal angeklickt werden muss.
15.12.3 Zusammenfassung Eigenschaften und Methoden
 
Die folgende Tabelle enthält einen Auszug der Eigenschaften und Methoden der Klasse Application.
Tabelle 15.18 Eigenschaften und Methoden des Typs »Application« (Auszug)
| Eigenschaft/Methode
|
Beschreibung
|
| CompanyName
|
(Eigenschaft) Gibt den der Anwendung zugeordneten Firmennamen zurück.
|
| ExecutablePath
|
(Eigenschaft) Liefert die Pfadangabe einschließlich des Dateinamens der ausführbaren Datei, die zum Starten der Anwendung verwendet wurde.
|
| ProductName
|
(Eigenschaft) Gibt den dieser Anwendung zugeordneten Produktnamen zurück.
|
| ProductVersion
|
(Eigenschaft) Gibt die dieser Anwendung zugeordnete Produktversion zurück.
|
| StartupPath
|
(Eigenschaft) Liefert die Angabe des Pfades, in dem sich die ausführbare Datei der Anwendung befindet. Der Name der ausführbaren Datei ist in der zurückgelieferten Zeichenfolge nicht enthalten.
|
| DoEvents
|
(Methode) Verarbeitet alle Windows-Meldungen, die sich derzeit in der Nachrichtenwarteschlange befinden.
|
| EnableVisualStyles
|
(Methode) Ermöglicht die Darstellung im XP-Stil.
|
| Exit
|
(Methode) Schließt alle Anwendungsfenster, sobald alle Nachrichten verarbeitet wurden.
|
| ExitThread
|
(Methode) Verlässt die Nachrichtenschleife für den aktuellen Thread und schließt alle Fenster des Threads.
|
| Run
|
(Methode) Beginnt die Ausführung einer Nachrichtenschleife einer Anwendung für den aktuellen Thread.
|
|